import type {Plugin} from 'vite';
import {createLogger} from 'vite';
import {AutoPagesOptions, AutoPagesPluginOptions, PageConfig} from './types';
import {PageParser} from './utils/PageParser';
import {PagesContext} from "./context";
import {ConfigLoader} from "./loader";
import {ConfigPreloader} from "./preload";
import {PagesJsonHelper} from "./helper";

/**
 * UniApp 自动构建 pages.json 的 Vite 插件
 * @param options 插件选项
 * @returns Vite 插件
 */
export default function uniAutoPages(options: AutoPagesPluginOptions = {}): Plugin[] {
    const packageName = '@jl15988/uni-auto-pages';
    // 使用 vite 的内置 logger
    const logger = createLogger(undefined, {
        prefix: 'uni-auto-pages'
    });

    const configLoader: ConfigLoader = new ConfigLoader(options, logger);
    let context: PagesContext;

    // 提前生成默认的 pages.json 防止 uni 插件报错
    PagesJsonHelper.generateDefault(configLoader.plugin.pagesJsonPath);

    async function initContext() {
        // 加载配置
        await configLoader.loadPagesConfig();
        // 检查并处理启动时的预加载配置（easycom、tabBar等）
        const needsRestart = await ConfigPreloader.checkAndHandleOnStartup(configLoader, logger);
        if (needsRestart) {
            await ConfigPreloader.restart();
            return;
        }

        // 创建上下文
        context = new PagesContext(configLoader, logger);
    }

    return [{
        name: 'vite-plugin-uni-auto-pages',
        enforce: 'pre', // 在其他插件之前执行
        async configResolved() {
            await initContext();

            try {
                // 生成 pages.json 文件
                await context.generate();
                logger.info('pages.json 初始化完成');
            } catch (error) {
                logger.error(`pages.json 构建失败: ${error}`);
            }
        },

        configureServer(server) {
            // 设置 Vite 开发服务器，启动文件监听
            context.setupViteServer(server);
        },

        // 在构建时转换页面文件内容
        transform(code, id) {
            // 只处理页面文件
            if (!context.isPageFile(id) || !context.checkPage(id)) {
                return null;
            }

            try {
                // 如果是生产环境构建，移除 defineOptions 中的页面配置
                // if (process.env.NODE_ENV === 'production') {
                //   // 移除 defineOptions 中的页面配置
                //   return pageParser.transformPageOptions(code, pageConfig);
                // }
                // 移除 defineOptions 中的页面配置
                return PageParser.transformPageOptions(code, packageName);
            } catch (error) {
                logger.error(`页面文件转换失败 ${id}: ${error}`);
            }

            return null;
        },
    }];
}

// 导出类型
export * from './types';
export * from './preload';

/**
 * 定义页面配置选项
 *
 * @param options - 页面配置选项
 * @returns 页面配置选项
 */
export function defineUniPage<T extends PageConfig>(options: T): T {
    return options;
}

/**
 * 定义自动构建的页面配置
 *
 * @param options - 自动构建的页面配置
 * @returns 自动构建的页面配置
 */
export function defineAutoPagesConfig(options: AutoPagesOptions): AutoPagesOptions {
    return options;
}
